package com.example.musicproject.Controller;

import com.example.common.utils.QiniuUtils;
import com.example.common.utils.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
@Api(tags = "文件上传")
public class CommonController {

    @Autowired
    private QiniuUtils qiniuUtils;

    @Value("${qiniu.url}")
    private String qiniuurl;

    /*取yaml内定义的属性值*/
    @Value("${musicproject.imgpath}")
    private String imgpath;

    @Value("${musicproject.audiopath}")
    private String audiopath;

    @Value("${musicproject.videopath}")
    private String videopath;
//    上传jpg,png,MP3,mp4到本地
//    只能上传jpg,png,MP3,mp4
    @PostMapping("/uploadimg")
    @ApiOperation(value = "上传图片", notes = "上传图片")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "文件", required = true, dataType = "MultipartFile", paramType = "body",example = "file")
    })
    public R<String> userimg(MultipartFile file){

        String originalFilename = file.getOriginalFilename();
        //拿到文件的后缀名 比如 .png  .jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //使用uuid生成的作为文件名的一部分，这样可以防止文件名相同造成的文件覆盖
        String fileName = UUID.randomUUID().toString() +suffix;
        String path=null;
        //创建一个目录对象，看传文件的时候，接收文件的目录存不存在
        if(suffix.equals(".png") || suffix.equals(".jpg") || suffix.equals(".jpeg")){
            path=imgpath;
        }
        if (suffix.equals(".mp3")){
            path=audiopath;
        }
        if (suffix.equals(".mp4")){
            path=videopath;
        }
        File dir=new File(path);
        if (!dir.exists()){
            //文件目录不存在，直接创建一个目录
            dir.mkdirs();
        }
        try {
            //把前端传过来的文件进行转存
            file.transferTo(new File(path + fileName));

        }catch (IOException e){
            e.printStackTrace();
        }
        return R.success(fileName);
    }

    @GetMapping("/download/{isdownload}")
    @ApiOperation(value = "下载文件", notes = "下载文件")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "isdownload", value = "是否下载", required = true, dataType = "int", paramType = "path",example = "1"),
            @ApiImplicitParam(name = "name", value = "文件名", required = true, dataType = "String", paramType = "path",example = "音乐.mp3")
    })
    public void download(@PathVariable("isdownload") int isdownload, String name, HttpServletResponse response){
        /*
        * 1.获取isdownload是否展示或者下载
        * 2.判断用户当前余额是否充值
        * 3.进行下载
        * */
        try {
            BufferedInputStream bufferedInputStream=null;
            //拿到文件的后缀名 比如 .png  .jpg
            String suffix = name.substring(name.lastIndexOf("."));
            String path=null;
            if(suffix.equals(".png") || suffix.equals(".jpg") || suffix.equals(".jpeg")){
                //设置写回去的文件类型
                path=imgpath;
                response.setContentType("image/jpeg");
            }
            if (suffix.equals(".mp3")){
                //设置写回去的文件类型
                path=audiopath;
                response.setContentType("audio/mp3");
            }
            if (suffix.equals(".mp4")){
                //设置写回去的文件类型
                path=videopath;
                response.setContentType("video/mp4");
            }
//            判断当前传回去的文件是下载还是展示
            if (isdownload == 1){
                response.setHeader("content-disposition", "attachment;filename="+ name);
            }
            //输入流，通过输入流读取文件内容  这里的name是前台用户需要下载的文件的文件名
            bufferedInputStream = new BufferedInputStream(new FileInputStream(new File(path + name)));

            //输出流，通过输出流将文件写回浏览器
            ServletOutputStream outputStream = response.getOutputStream();
            //定义缓存区，准备读写文件
            int len  = 0 ;
            byte[] buff = new byte[1024];
            while ((len = bufferedInputStream.read(buff)) != -1){
                outputStream.write(buff,0,len);
                outputStream.flush();
            }
            //关流
            outputStream.close();
            bufferedInputStream.close();
        }catch (Exception e){
            log.info("在传输文件IO流时，客户端突然关闭，报“你的主机中的软件中止了一个已建立的连接。”，无影响");
            e.printStackTrace();
        }
    }

    /*
    * 七牛云文件上传
    * */
    @PostMapping("/qiniu/upload")
    @ApiOperation(value = "上传文件", notes = "上传文件")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "文件", required = true, dataType = "MultipartFile", paramType = "body",example = "file")
    })
    public R<String> upload(MultipartFile file) {
        String wenjianj="";
        //原始文件名称 比如说aa.png
        String originalFilename = file.getOriginalFilename();
        //唯一的文件名称
        String fileName = UUID.randomUUID().toString() + "." + StringUtils.substringAfterLast(originalFilename, ".");
        //拿到文件的后缀名 比如 .png  .jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        if(suffix.equals(".png") || suffix.equals(".jpg") || suffix.equals(".jpeg")){
            //设置写回去的文件类型
            wenjianj="static/imgupload/";
        }
        if (suffix.equals(".mp3")){
            //设置写回去的文件类型
            wenjianj="static/audioupload/";
        }
        if (suffix.equals(".mp4")){
            //设置写回去的文件类型
            wenjianj="static/video/";
        }
        //上传文件上传到那里呢？　七牛云　云服务器
        //降低我们自身应用服务器的带宽消耗
        boolean upload = qiniuUtils.upload(file, fileName, wenjianj);
        if (upload) {
//            可以对传进来的文件进行一个判断然后放在不同的文件夹里面
            return R.success(fileName);
        }
        return R.error("上传失败!");
    }

//    此接口有问题
    /*@GetMapping("/qiniu/download/{downloadfile}")
    public R<String> download(@PathVariable String downloadfile){
        String wenjianj="";
        String suffix = downloadfile.substring(downloadfile.lastIndexOf("."));
        if(suffix.equals(".png") || suffix.equals(".jpg")){
            //设置写回去的文件类型
            wenjianj="static/imgupload/";
        }
        if (suffix.equals(".mp3")){
            //设置写回去的文件类型
            wenjianj="static/audioupload/";
        }
        if (suffix.equals(".mp4")){
            //设置写回去的文件类型
            wenjianj="static/video/";
        }
        String downloadurl = null;
        try {
            downloadurl = qiniuUtils.download(downloadfile, wenjianj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return R.success(downloadurl);
    }*/

    /*
    * 七牛云文件删除
    * */
    @GetMapping("/qiniu/delect/{downloadfile}")
    @ApiOperation(value = "删除文件", notes = "删除文件")
    public R<String> delect(@PathVariable String downloadfile) {
        String wenjianj = "";
        String suffix = downloadfile.substring(downloadfile.lastIndexOf("."));
        if (suffix.equals(".png") || suffix.equals(".jpg") || suffix.equals(".jpeg")) {
            //设置写回去的文件类型
            wenjianj = "static/imgupload/";
        }
        if (suffix.equals(".mp3")) {
            //设置写回去的文件类型
            wenjianj = "static/audioupload/";
        }
        if (suffix.equals(".mp4")) {
            //设置写回去的文件类型
            wenjianj = "static/video/";
        }
        boolean delete = qiniuUtils.delete(downloadfile,wenjianj);
        if (delete) {
            return R.success("删除成功!");
        }else {
            return R.error("删除失败!");
        }
    }


}
